package com.gallop.mq.core;

import com.gallop.mq.MQProperties;
import com.gallop.mq.MQTemplate;

/**
 * {@link MQTemplate} 实例化器。调用{@link #init(MQProperties, MQMessageDispatcher, MQMessageCodec, MQExecutorProvider)}方法构造{@link MQTemplate}。
 * <p>
 * 通常情况下组件内置了默认的实例化器以供使用，无需关注具体实现。在MQ配置中为{@link MQProperties#getType()}选择非custom值即可静默完成全部初始化工作，实例化对应类型的MQ操作对象；
 * <p>
 * 如需自定义MQ操作对象实现，则需要：
 *
 * <li>1. MQ配置中，{@link MQProperties#getType()}选择custom</li>
 * <li>2. 自行实现此接口，并注册成为spring bean;</li>
 * <li>3. 实现init方法，用参数列表提供的相关配置，实例化并返回自定义的MQTemplate实现；</li>
 */
@FunctionalInterface
public interface MQTemplateInitializer {

    /**
     * 实例化消息队列操作对象{@link MQTemplate}
     *
     * @param properties       MQ相关配置
     * @param dispatcher       本地扫描消息监听分发器
     * @param codec            MQ消息编解码器
     * @param executorProvider 提供MQ工作线程池（选用）
     * @return 实例化MQ操作对象
     */
    MQTemplate init(MQProperties properties, MQMessageDispatcher dispatcher, MQMessageCodec codec, MQExecutorProvider executorProvider);
}
